package controladores;

import entidades.RegistroInteresse;
import entidades.Util;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

/**
 * Thread que fica verificando se os registros de interesse já expiraram
 *
 */
public class ControladoraDePrazos implements Runnable {

    /**
     * Método que fica verificando se expirou os prazos dos registros de compras
     * e vendas.
     *
     */
    @Override
    public void run() {
        while (true) {
            RegistroInteresse compra = null;
            RegistroInteresse venda = null;

            if (!Util.compras.isEmpty()) {
                compra = (RegistroInteresse) Util.compras.peek();
            }

            if (!Util.vendas.isEmpty()) {
                venda = (RegistroInteresse) Util.vendas.peek();
            }
            //Verifica se o registro de compra expirou o seu prazo. Se sim, remove da lista e notifica o acionista.
            if (compra != null) {
                String tempoInicial = compra.getTempoInicial();
                tempoInicial = tempoInicial.replace(',', '.');
                tempoInicial = tempoInicial.trim();
                if ((System.currentTimeMillis() - Double.parseDouble(tempoInicial)) > compra.getPrazo()) {
                    Util.janelaPrincipal.inserirLog("O registro de compra de ações da empresa " + compra.getAcao().getEmpresa() + " expirou!\n");
                    Util.compras.poll();
                    try {
                        XmlRpcClient client = obterReferenciaCliente(compra.getCaminhoCliente());
                        ArrayList parametros = new ArrayList();
                        parametros.add(compra.getAcao().getEmpresa());
                        parametros.add(compra.getTempoInicial());
                        client.execute("notificarCompraExpirada", parametros);
                    } catch (MalformedURLException ex) {
                        Logger.getLogger(ControladoraDePrazos.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (XmlRpcException ex) {
                        Logger.getLogger(ControladoraDePrazos.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }

            //Verifica se o registro de venda expirou o seu prazo. Se sim, remove da lista e notifica o acionista.
            if (venda != null) {
                String tempoInicial = venda.getTempoInicial();
                tempoInicial = tempoInicial.replace(',', '.');
                tempoInicial = tempoInicial.trim();
                if ((System.currentTimeMillis() - Double.parseDouble(tempoInicial)) > venda.getPrazo()) {
                    Util.janelaPrincipal.inserirLog("O registro de venda de ações da empresa " + venda.getAcao().getEmpresa() + " expirou!\n");
                    Util.vendas.poll();
                    try {
                        XmlRpcClient client = obterReferenciaCliente(venda.getCaminhoCliente());
                        ArrayList parametros = new ArrayList();
                        parametros.add(venda.getAcao().getEmpresa());
                        parametros.add(venda.getTempoInicial());
                        client.execute("notificarVendaExpirada", parametros);
                    } catch (MalformedURLException ex) {
                        Logger.getLogger(ControladoraDePrazos.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (XmlRpcException ex) {
                        Logger.getLogger(ControladoraDePrazos.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }
            }
        }
    }

    /**
     * Dado um camimnho de conexão, retorna uma referencia para o cliente do
     * tipo XmlRpcClient.
     *
     * @param caminhoConexao
     * @return referencia para o cliente
     * @throws MalformedURLException Caso o caminho esteja incorreto
     */
    private XmlRpcClient obterReferenciaCliente(String caminhoConexao) throws MalformedURLException {
        XmlRpcClient client = null;
        client = new XmlRpcClient();
        XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
        config.setServerURL(new URL(caminhoConexao));
        config.setEnabledForExtensions(true);
        client.setConfig(config);
        return client;
    }
}
